<?php

namespace app\common\library;

use Yansongda\Pay\Pay;
use Yansongda\Pay\Log;

/**
 * 支付宝支付控制器
 */
class Alipay
{

    protected $config = [
        'app_id' => '2019092867848835',
        'notify_url' => 'http://yansongda.cn/notify.php',
        'return_url' => 'http://yansongda.cn/return.php',
        'ali_public_key' => 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWJKrQ6SWvS6niI+4vEVZiYfjkCfLQfoFI2nCp9ZLDS42QtiL4Ccyx8scgc3nhVwmVRte8f57TFvGhvJD0upT4O5O/lRxmTjechXAorirVdAODpOu0mFfQV9y/T9o9hHnU+VmO5spoVb3umqpq6D/Pt8p25Yk852/w01VTIczrXC4QlrbOEe3sr1E9auoC7rgYjjCO6lZUIDjX/oBmNXZxhRDrYx4Yf5X7y8FRBFvygIE2FgxV4Yw+SL3QAa2m5MLcbusJpxOml9YVQfP8iSurx41PvvXUMo49JG3BDVernaCYXQCoUJv9fJwbnfZd7J5YByC+5KM4sblJTq7bXZWQIDAQAB',
        // 加密方式： **RSA2**
        'private_key' => 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnb5Lr4w9rJlLA3vGxMkvBFcEtO3RYyHRmWJjPG/MG7XkrrVZvlED0Cd33PQWEBKZHWj8wET7eusU+vdVD/YGT1m0OYL2H+iTwKwXprbKB6QwynfLVrLFMYsyNw8xX06E6klpFus04lk65xTkmNW5u0+qpNxUuReF+TkdGLtngeC79zEY7oD9RxdyMCzuPykgc7rOQLDgUY6IZBa3R4Vn8GdhbFZ4LplIieM4KNV93k/YGZzN6Vq4/zmfQ58S25A7BVgE8MnxCb3thVICvADFyr8v1OmOQYHpx5b9UT87g6LOrcr0xLXv96qJ3Pqfk5UbY36S/AzAwi3teCbRVhpK7QIDAQAB',
//        'log' => [ // optional
//            'file' => './logs/alipay.log',
//            'level' => 'debug', // 建议生产环境等级调整为 info，开发环境为 debug
//            'type' => 'single', // optional, 可选 daily.
//            'max_file' => 30, // optional, 当 type 为 daily 时有效，默认 30 天
//        ],
        'http' => [ // optional
            'timeout' => 5.0,
            'connect_timeout' => 5.0,
            // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
        ],
//        'mode' => 'dev', // optional,设置此参数，将进入沙箱模式
    ];

    public function index($order)
    {
//        $order = [
//            'out_trade_no' => time(),
//            'total_amount' => '1',
//            'subject' => 'test subject - 测试',
//        ];
        if (isset($order['notifyurl'])) {
            $this->config['notifyurl'] = $order['notifyurl'];
            unset($order['notifyurl']);
        }
        if (isset($order['returnurl'])) {
            $this->config['returnurl'] = $order['returnurl'];
            unset($order['returnurl']);
        }
        $alipay = Pay::alipay($this->config)->web($order);

        return $alipay->send();// laravel 框架中请直接 `return $alipay`
    }

    public function return()
    {
        $data = Pay::alipay($this->config)->verify(); // 是的，验签就这么简单！

        // 订单号：$data->out_trade_no
        // 支付宝交易号：$data->trade_no
        // 订单总金额：$data->total_amount
    }

    public function notify()
    {
        $alipay = Pay::alipay($this->config);

        try {
            $data = $alipay->verify(); // 是的，验签就这么简单！

            // 请自行对 trade_status 进行判断及其它逻辑进行判断，在支付宝的业务通知中，只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时，支付宝才会认定为买家付款成功。
            // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号；
            // 2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额）；
            // 3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）；
            // 4、验证app_id是否为该商户本身。
            // 5、其它业务逻辑情况

//            Log::debug('Alipay notify', $data->all());
        } catch (\Exception $e) {
            // $e->getMessage();
        }

        return $alipay->success()->send();// laravel 框架中请直接 `return $alipay->success()`
    }
}
